Rusty Full Stack

El blog para los amantes de Rust, Ionic y Vuejs

Jaime Blandón
Jaime Blandón Desarrollador de software desde 2009, entusiasta de Rust, Vuejs y Ionic!. Fundador de este blog, espero que las publicaciones te sean de utilidad y si tienes comentarios para mejorar, son bienvenidos.

Instala Rust, Cargo y Cargo Edit! [Parte 3]

Hola, en el post anterior hemos continuado hablando sobre Cargo. Este post será el último de esta pequeña "mini serie" sobre Cargo y estará dedicado a una herramienta bastante útil la cual se llama Cargo Edit.

¿Qué es Cargo Edit?

Antes que nada, Cargo Edit es un proyecto colaborativo que puedes encontrar en github en este repositorio, si tienes la oportunidad, te recomiendo que vayas a echarle un vistazo porque está buenísimo (y sobre todo si después de leer este post tienes ideas para contribuir al proyecto 😊).

Ahora bien,  Cargo Edit también es una herramienta para extender las funciones de Cargo y facilitarnos la vida con la gestión de las dependencias en el archivo Cargo.toml.

Si has utilizado cargo y Cargo.toml, habrás escrito. directamente las dependencias que necesitas en el archivo, viendo la versión que necesitas en crates.io y luego dejando que Cargo instal por nosotros las dependencias.

Si vienes de un background como python, a lo mejor extrañes pip o si vienes de javascript, a lo mejor extrañes npm o yarn para gestionar tus paquetes o gems. Cargo edit precisamente viene agregar estas características que a lo mejor extrañamos de otros lenguajes sobre la gestión de nuestros crates.

Instalando Cargo Edit.

La instalación de Cargo Edit es bastante sencilla y lo podemos realizar con el mismo Cargo,  para instalar Cargo Edit, abre una terminal y ejecuta el siguiente comando.

cargo install cargo-edit

Nota: si estás utilizando alguna distribución de linux ubuntu, asegúrate de tener instalado libssl-dev y pkg-config.

Si quieres instalarlo con alguna característica de openssl, también puedes ejecutar:

cargo install cargo-edit --features vendored-openssl

La instalación instalará varios sub comandos por nosotros, vamos a ver los más escenciales.

Utilizando Cargo Edit.

Vamos a hacer un pequeño programa en el cual vamos a agregar un par de crates con cargo edit para irnos acostumbrando a utilizarlo, el programa será bastante sencillo y por simplicidad no realizaremos ninguna validación.

Crearemos un programa que genere un número aleatorio del 1 al 9 y le pediremos al usuario desde la terminal que adivine el número generado. Empecemos creando el proyecto con cargo:

cargo new adivina-random

(Puedes ver el código final en este repositorio)

Ahora vamos a aprender a pedirle al usuario que ingrese un input desde la terminal, en este momento lo vamos a hacer utilizando las librerías estándares de python, sin agregar ningún crate. Abre el archivo src/main.rs y coloca el siguiente código.

        
        
            // src/main.rs

use std::io::stdin;

fn main() {
    let mut input_string = String::new();
    println!("ADIVINA EL NUMERO!!");

    loop {
        println!("Ingresa tu numero:");
        stdin().read_line(&mut input_string).unwrap();
        if input_string.eq("5") {
            println!("Adivinaste!");
            break;
        }
    }

    println!("Fin del programa");
}

        
        
    

Si ejecutas el programa anterior con cargo run, vas a observar que en tu terminal, el programa te solicitará que ingreses un número, si no colocas el número 5, entonces el programa continuará indefinidamente (o hasta que presiones Ctrl + C 🎉)

Hasta el momento no hemos generado ningún número aleatorio y tampoco hemos utilizado un crate externo, pero como la idea es utilizarlos vamos a modificar un poco nuestro código agregando un crate para capturar el input, Ok a lo mejor te parecerá que ya lo estamos haciendo con el código anterior (y es cierto), pero vamos, utilicemos cargo edit, verás que es divertidísimo. 😎

Para capturar el input, vamos a utilizar un crate llamado read_line, si lo agregamos utilizando simplemente cargo, sabemos que debemos abrir el archivo Cargo.toml y bajo [dependencies] deberemos colocar la versión que queremos y que podemos ver en el crate (0.0.1), pero en lugar de hacer eso, desde nuestra terminal ejecutemos:

cargo add read_line

OJO: Debes tener cargo edit instalado para que comando anterior no falle

Si todo sale bien deberías de ver el siguiente mensaje en tu terminal:

Ahora, por arte de magia (o de cargo edit 🧙‍♂️) verás que la dependencia fue agregada en su última versión en tu archivo Cargo.toml

        
        
            // Cargo.toml

[package]
name = "adivina-random"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
read_line = "0.0.1"

        
        
    

cargo add, por defecto, colocará la última versión del crate, si necesitas ser más explícito en una versión determinada, puedes usar la siguiente sintaxis:

cargo add read_line@0.0.1

Ahora podemos utilizar las funciones del crate read_line, vamos a modificar nuestro src/main.rs con el siguiente código:

        
        
            // src/main.rs

use read_line::read_line_prompt;

fn main() {
    println!("ADIVINA EL NUMERO!!!");
    loop {
        let user_input = read_line_prompt("Ingresa tu numero:");
        if user_input.contains("5") {
            break;
        }
        println!("Intentalo de Nuevo!")
    }

    println!("Felicidades, has adivinado!");
}

        
        
    

Si ejecutamos el programa, prácticamente tenemos el mismo resultado anterior donde nos pide un input y el programa continuará hasta ingresar un "5" o un CTRL + C. Disculpa si el código no está super explicado, no es el propósito del ejemplo ahondar mucho en ello, sino más bien acostumbrarnos a cargo edit.

Ahora generemos el número aleatorio entre 1 y 9 con un nuevo crate llamado rand. Intenta instalar la última versión de rand con cargo edit sin ver el siguiente comando 😉

cargo add rand

Correcto! con el comando anterior instalamos el crate rand, ahora vamos a generar un número entre 1-9 y haremos que el usuario ingrese números hasta que lo adivine, debes considerar que el programa, por simplicidad del ejemplo, no le hemos colocado ninguna validación. Modifiquemos nuestro archivo src/main.rs 

        
        
            // src/main.rs

use rand::{thread_rng, Rng};
use read_line::read_line_prompt;

fn main() {
    println!("ADIVINA EL NUMERO!!!");

    // Esta funcion es parte del crate rand
    let mut rng = thread_rng();

    // En Rust, los rangos si toman el primer valor, y excluyen el valor mas grande
    // Para la siguiente linea generaria numeros del 1 al 9.
    let numero: u32 = rng.gen_range(1..10);
    println!("Se ha generado un numero del 1 al 9, adivinalo!");
    loop {
        let user_input = read_line_prompt("Ingresa tu numero:");

        // Utilizamos un contains, porque en el input del usuario, captura el salto de linea \n
        if user_input.contains(&numero.to_string()) {
            break;
        }
        println!("Intentalo de Nuevo!")
    }

    println!("Felicidades, has adivinado!");
}

        
        
    

Si ejecutas ahora el programa con cargo run, verás que ahora sí se genera un número entre 1 y 9, puedes intentar adivinar el número 🧐

(Puedes ver el código final en este repositorio)

Otros Comandos Útiles de Cargo Edit.

  • cargo upgrade: Este comando actualizará todas las dependencias de tu archivo Cargo.toml a la última versión, es importante que cuando lo hagas, tengas un backup por si llegas a tener algún problema de dependencias.
  • cargo rm <nombre crate>: Quita de tus dependencias el crate que especifiques.
  • cargo set-version <version>: Este comando colocará la versión que tu especifiques en tu archivo Cargo.toml.

Como hemos visto con un ejemplo rápido y sin mucho detalles sobre el código, cargo edit nos facilita mucho el tema de la gestión de nuestras dependencias o crates, como si se tratase de npm, yarn, pip, maven y otros gestores de paquetes en distintos lenguajes.

Con esto hemos finalizado la "mini serie" sobre Cargo y comenzaremos a hablar de más temas.

Espero que este post te haya sido de utilidad, si ha sido así compártelo con tus amigos y en tus redes sociales 😃

println!("Hasta la próxima!");


 Utilizamos cookies propias y de terceros para mejorar tu experiencia, mostrar publicidad y análisis de navegación, puedes encontrar el detalle en nuestra Política de Cookies